package transport.generator;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Random;
import skladowisko.Kontener;
import skladowisko.ParametryFizyczne;
import skladowisko.ParametryPrzeznaczenie;
import skladowisko.Pociag;
import skladowisko.Wagon;
import skladowisko.dictonaries.StatusObiektu;
import skladowisko.dictonaries.TypKontenera;
import skladowisko.transport.StatusTransportu;
import skladowisko.transport.TransportPrzychodzacy;

/**
 *
 * @author kedziers
 */
public class TransportGenerator {

    private TransportPrzychodzacy transport;
    private ModelGeneracji model;

    public TransportGenerator(ModelGeneracji model) {
        this.model = model;
    }

    public TransportPrzychodzacy generujTransport() {
        Random r = new Random();
        transport = new TransportPrzychodzacy();

        int wagony = model.getMinWagony() + r.nextInt(model.getMaxWagony() - model.getMinWagony() + 1);
        
        TransportPrzychodzacy nowy = new TransportPrzychodzacy();
        nowy.setPlanowanaData(losujDatePrzybycia());

        DateFormat df = new SimpleDateFormat("yyyyMMddhhmm");
        String nazwa = "transport_" + df.format(nowy.getPlanowanaData()) + "_" + "w_" + wagony;
        losujMiejsce();

        nowy.setNazwa(nazwa);
        nowy.setStatus(StatusTransportu.PLANOWANY);

        Pociag pociag = new Pociag("pociag-" + nazwa);

        for (int i = 0; i < wagony; i++) {
            pociag.dodajWagon(i + 1, model.getMiejscNaWagonie());
            Wagon wagon = pociag.getWagon(i + 1);
            for (int k = 0; k < model.getMiejscNaWagonie(); k++) {
                wagon.getZawartoscWagonu().polozObiekt(generujKontener());
            }

        }

        nowy.setSrodekTransportu(pociag);
        return nowy;
    }

    private Kontener generujKontener() {
        Kontener k = new Kontener(new ParametryFizyczne(TypKontenera.T40, -1));
        int nextId = 1;
        k.setNumerRozpoznawczy("K_" + nextId);

        k.setParametryPrzeznaczenie(new ParametryPrzeznaczenie(losujMiejsce(), null));
        k.setStatus(StatusObiektu.NIEZNANY);

        return k;
    }

    private String losujMiejsce() {
        Random r = new Random();
        int indeks = r.nextInt(model.getPorty().size());

        return model.getPorty().get(indeks);
    }

    private Date losujDatePrzybycia() {
        Random r = new Random();

        Calendar calendar = new GregorianCalendar();
        calendar.setTime(new Date());
        long min = calendar.getTimeInMillis();

        calendar.add(Calendar.DAY_OF_MONTH, model.getIleDni());

        long max = calendar.getTimeInMillis();

        long przedzial = max - min;

        int dodatek = r.nextInt((int) przedzial);

        return new Date(min + dodatek);
    }
}
